'''
拼接最大数字问题
    有n个非负整数,将其按照字符串拼接的方式拼接为一个整数.如何拼接可以使得到的整数最大?

        例:32,94,128,1286,6,71可以拼接出的最大整数为 94716321286128
'''
# from functools import cmp_to_key
# nums = [32,94,128,1286,6,71]
#
# def compare(x,y):
#     if x+y < y+x:
#         return 1
#     elif x+y > y+x:
#         return -1
#     else:
#         return 0
#
# def max_combine(nums):
#     nums = list(map(str,nums))
#     nums.sort(key = cmp_to_key(compare))
#     return ''.join(nums)
#
# print(max_combine(nums))

from functools import cmp_to_key

nums = [32, 94, 128, 1286, 6, 71]

def max_combine(nums):
    nums = list(map(str, nums))
    # 用 lambda 表达式作为比较函数
    nums.sort(key=cmp_to_key(lambda x, y: 1 if x + y < y + x else -1 if x + y > y + x else 0))
    result = ''.join(nums)
    return result if result[0] != '0' else '0'

print(max_combine(nums))  # 输出：94716321286128
'''
在 strs.sort(key=cmp_to_key(compare)) 中，compare(x, y) 函数的两个参数 x 和 y，本质上是从列表 strs 中成对选取的元素，由排序算法（如 Python 的 Timsort）在排序过程中自动传入。
详细过程拆解
整个参数传递过程可以分为以下几个步骤，结合排序的底层逻辑理解更清晰：
1. 排序前的准备：cmp_to_key 生成 “适配器”
cmp_to_key(compare) 会返回一个特殊的 “适配器” 对象（本质是一个函数）。这个适配器的作用是：
当 sort() 方法需要比较列表中的元素时，它会将元素 “包装” 起来，让排序算法能通过这个适配器间接调用 compare 函数。
2. 排序算法开始工作：选取成对元素
Python 的 sort() 方法使用高效的 Timsort 算法，其核心逻辑是通过反复比较列表中的成对元素来确定最终顺序。
例如，对于列表 strs = ['32', '94', '128', '1286', '6', '71']，排序算法会在不同阶段选取不同的元素对进行比较（比如先比较 '94' 和 '71'，再比较 '71' 和 '6' 等）。
3. 适配器将元素对传入 compare 函数
当排序算法需要比较某一对元素（假设是 a 和 b，比如 a='94'，b='71'）时：
适配器会先将 a 和 b 这两个元素 “提取” 出来。
然后直接调用 compare(a, b)，将 a 作为第一个参数 x，b 作为第二个参数 y 传入。
4. 根据 compare 返回值决定元素顺序
compare(x, y) 执行后返回 -1、0 或 1，排序算法根据这个返回值判断 x 和 y 的先后顺序：
若返回 -1：x 应排在 y 前面（如 '94' 和 '71' 比较时，'9471' > '7194'，compare 返回 -1，因此 '94' 排在 '71' 前面）。
若返回 1：y 应排在 x 前面。
若返回 0：顺序无关。
5. 重复过程直到排序完成
排序算法会不断选取新的元素对（如 '71' 和 '6'、'6' 和 '32' 等），重复步骤 3-4，直到所有元素的顺序都确定，列表排序完成。
关键总结
compare(x, y) 的两个参数 x 和 y 并非由我们手动传入，而是：
排序算法在遍历列表时，自动选取需要比较的成对元素；
通过 cmp_to_key 生成的适配器，将这两个元素分别作为 x 和 y 传给 compare 函数；
最终根据 compare 的返回值完成排序。
这种机制让排序算法能按照我们自定义的逻辑（而非默认规则）来排列元素，这也是解决 “拼接最大数字” 这类问题的核心。
'''